home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 April: Mac OS SDK / Dev.CD Apr 98 SDK2.toast / Development Kits (Disc 2) / QuickTime / Programming Stuff / Documentation / develop articles / develop Issue 15 / Text To Speech media handler / Code / MyOverrideRoutine2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-26  |  3.2 KB  |  114 lines  |  [TEXT/KAHL]

  1. #include "ComponentData.h"
  2. #include <OSUtils.h>
  3. #include <Script.h>
  4. #include <Language.h>
  5. #include "MyOverrideRoutine2.h"
  6. #include "MyOpenComponent.h"
  7.  
  8. pascal ComponentResult MyOverrideRoutine2( PrivateGlobals **storage,TimeValue atMediaTime, long flagsIn, long *flagsOut, const TimeRecord *movieTime )
  9. {
  10. /*
  11. Possible errors:
  12.     GetMediaSample or SpeakText fail with -108. Not fatal, might not speak. Oh well.
  13.     There is no text in the text sample, so we pass back -1. Who cares.
  14. */
  15.  
  16. OSErr            err            = -1;
  17. ComponentResult    result;
  18. long            textSampleSize     = 0;
  19.  
  20. err    =    GetMediaSample(     (*storage)->coolMedia,     // Get this from MyMediaInitialize
  21.                             (*storage)->textH,         // Pass this in to SpeakText
  22.                             0,                         // The textBuffer can grow as much as it wants. Not so great an idea
  23.                             &textSampleSize,            // Get this for SpeakText
  24.                             atMediaTime,            // Starting time of media to be retrieved, 
  25.                                                     //media timescale                 
  26.                             nil, nil, nil, nil, 0, nil, nil );
  27.  
  28. if (!err)
  29.     {
  30.     short    textSize, language;
  31.     Handle    textSampleHandle = (*storage)->textH;
  32.     
  33.     /* First two bytes of the text sample contains the size of the text */
  34.     textSize = *(short*)(*textSampleHandle);
  35.     
  36.     if (textSize > 0)
  37.         {
  38.         Ptr        textPtr;
  39.         Handle    textHandle;
  40.         long    textSampleHeader;
  41.         char    *textSamplePtr;
  42.         
  43.         /* Sample size is returned by GetMediaSample. */
  44.         textSampleHeader = textSampleSize - textSize;
  45.         
  46.         /*     The header is usually 2 bytes, which specifies the size of the
  47.             text. Sometimes, though, it can have extra information such as 
  48.             style information. We need to jump past the header to get to
  49.             the text.    */
  50.         textSamplePtr = (char *) *textSampleHandle;
  51.         textPtr = (Ptr)( textSamplePtr  +  textSampleHeader );
  52.         
  53.         language = GetMediaLanguage((*storage)->coolMedia);
  54.         switch(language)
  55.             {
  56.             case langEnglish:            
  57.                 err = SpeakEnglish((*storage)->coolSpeechChannel,textPtr,textSize);
  58.                 break;
  59.             case langJapanese:            // langJapanese = 11   'Language.h'
  60.                 err = SpeakJapanese(storage,textPtr,textSize);
  61.                 break;
  62.             default:
  63.                 err = SpeakText (    (*storage)->coolSpeechChannel, 
  64.                                     textPtr, 
  65.                                     textSize);    
  66.             }
  67.         }
  68.     }
  69.     
  70. return (ComponentResult) err;
  71. }
  72.  
  73. OSErr    SpeakEnglish(SpeechChannel coolSpeechChannel, Ptr textPtr, long textSize)
  74. {
  75.     OSErr    err;
  76.     
  77.     err = SpeakText (    coolSpeechChannel, 
  78.                         textPtr, 
  79.                         textSize);    
  80.     return err;
  81. }
  82.  
  83.  
  84. OSErr SpeakJapanese(PrivateGlobals **storage, Ptr textPtr, long textSize)
  85. {
  86.     Handle    translatedTextH = (*storage)->translatedTextH;
  87.     OSErr    err;
  88.     Handle    textHandle;
  89.     
  90.     textHandle = NewHandle(textSize);
  91.     HLock(textHandle);
  92.     BlockMove(textPtr,*textHandle,textSize);
  93.     SetHandleSize(translatedTextH,textSize);
  94.     err = Transliterate(    textHandle, 
  95.                             translatedTextH, 
  96.                             smTransAscii1, 
  97.                             smMaskKana1 + smMaskKana2 + smMaskGana2    );
  98.     HUnlock(textHandle);
  99.     DisposeHandle(textHandle);
  100.     if (err == noErr)        // we must pass the HIRAGANA or KATAKANA text, not Kanji.
  101.         {
  102.         short    index;
  103.  
  104.         HLock(translatedTextH);
  105.         for(index=0;index<GetHandleSize(translatedTextH);index++)
  106.             if ((*(*translatedTextH+index) < 0x20) || (*(*translatedTextH+index) > 0x80))
  107.                 *(*translatedTextH+index)= 0;
  108.         err = SpeakText ((*storage)->coolSpeechChannel, (Ptr) *translatedTextH, GetHandleSize(translatedTextH));
  109.         HUnlock(translatedTextH);
  110.         }
  111.     return err;
  112. }
  113.  
  114.